package com.kaifamiao.set;

import java.util.Comparator;
import java.util.TreeSet;

/**
 * 0、TreeSet 保证其内部元素按照一定顺序排列
 * 1、在 TreeSet 内部 采用 红黑树 来存储 元素
 *    本质上是借助于一个 TreeMap 实例来存储 元素
 * 2、将 元素 添加到 TreeSet 中时，会根据 元素 确定 元素 在 二叉树上的存放位置
 *      根据元素的自然顺序 或 根据指定的比较器 排序后确定其存放位置
 * 3、TreeSet 的直接父类是 AbstractSet类
 * 4、TreeSet 中的 元素 【不能为 null】
 * 5、TreeSet 不是 线程安全 的
 * 6、TreeSet 类的 iterator 方法返回的迭代器是 快速失败 的
 */
public class AnalyseTreeSet {

    public static void main(String[] args) {

        // 创建TreeSet实例时若未指定比较器，则采用元素的自然顺序进行排序
        TreeSet<String> ts = new TreeSet<>();

        ts.add( "李芳" ); // m.put( "李芳", PRESENT )
        ts.add( "李元芳" ); // m.put( "李元芳", PRESENT )
        System.out.println( ts );

        System.out.println( "李元芳".compareTo( "李芳" ) );

        Comparator<Integer> comparator = new Comparator<Integer>() {
            @Override
            public int compare(Integer a, Integer b) {
                if( a != null && b != null ) {
                    System.out.printf( "比较 %d 和 %d\n", a.intValue(), b.intValue() );
                    return - ( a - b );
                }
                return 0;
            }
        };

        // 若创建TreeSet时指定了比较器，则其内部元素会根据比较器确定顺序
        TreeSet<Integer> numbers = new TreeSet<>( comparator );

        numbers.add( 100 );
        System.out.println( numbers );

        numbers.add( 88 );
        System.out.println( numbers );

        numbers.add( 108 );
        System.out.println( numbers );

    }

}
